package com.clps.designPatterns.chapter01.迪米特原则;

import java.util.ArrayList;
import java.util.List;

/**
 * 迪米特原则,叫最少知道原则,即一个类自己依赖的类知道的越少越好.也就是说,对于被依赖的类不那么多复杂,都尽量将逻辑封装在在类的内部
 * 对外除了提供public方法,不对外 开放任何信息,类于类关系密切,耦合度越大,耦合的方式很多,依赖,关联,组合,聚合,等
 * 直接朋友概念
 * 两个对象之间有耦合关系，就说这两个对象之间是朋友关系。其中出现成员变量，方法参数，方法返回值中的类称为直接朋友，而出现在局部变量中的类不是直接朋友。
 * 从原则上说，陌生的类最好不要以局部变量的形式出现在类的内部。
 *
 *
 * 迪米特原则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此可以降低耦合的关系,降低耦合关系,并没有要去完全没有依赖的关系,过渡的使用迪米特原则,容易产生大量的中间类,导致复杂度变大,
 * 所以在使用迪米特的原则要根据实际的业务去权衡
 */
public class demo01 {
    public static void main(String[] args) {
        HeadCompamyEmpManage headCompamyEmpManage = new HeadCompamyEmpManage();
        BranchCompanyEmpManager branchEmp = new BranchCompanyEmpManager();
        headCompamyEmpManage.printEmp(branchEmp);
    }
}

class HeadCompanyEmp{
    public  String name;
    public HeadCompanyEmp(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "HeadCompanyEmp{" +
                "name='" + name + '\'' +
                '}';
    }
}

class BranchCompanyEmp{
    public String name;

    public BranchCompanyEmp(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "BranchCompanyEmp{" +
                "name='" + name + '\'' +
                '}';
    }
}

class BranchCompanyEmpManager{
    //添加分公司的员工
    public List<BranchCompanyEmp> addEmp(){
      List<BranchCompanyEmp> list = new ArrayList<>();
        for (int i = 0; i <=3 ; i++) {
            list.add(new BranchCompanyEmp("分公司的员工"+i));
        }
        return  list;
    }

    //获取分公司的员工
    public  void  pringBranchCompanyEmp(){
        List<BranchCompanyEmp> list = addEmp();
        for (BranchCompanyEmp emp : list) {
            System.out.println("emp = " + emp);
        }
    }
}

/**
 * 总公司管理员工,基于迪米特原则,不出现陌生类
 */

class HeadCompamyEmpManage{

    //添加总公司的员工
    public List<HeadCompanyEmp> addHeadEmp(){
        List<HeadCompanyEmp> list = new ArrayList<>();
        for (int i = 0; i <=3 ; i++) {
            list.add(new HeadCompanyEmp("总公司员工"+i));
        }
        return  list;
    }

    public void printEmp(BranchCompanyEmpManager empManager){
        //打印分公司的员工
        empManager.pringBranchCompanyEmp();
        List<HeadCompanyEmp> headCompanyEmps = addHeadEmp();
        for (HeadCompanyEmp headCompanyEmp : headCompanyEmps) {
            System.out.println(headCompanyEmp);
        }
    }

}